//
//  HMComposeView.swift
//  WeiBo14
//
//  Created by HM on 16/3/9.
//  Copyright © 2016年 HM. All rights reserved.
//

import UIKit
import pop

class HMComposeView: UIView {
    
    // 可以不用添加weak,因为在点击按钮之后,弹出控制器之后,会执行从父控件中移除的操作,父控件就不会对其进行强引用
    // 当当前View被添加到控制器的View上的时候:
    /**
        控制器强引用其View
        View强引用当前视图(因为当前视图被添加到View)
        当前视图又强引用控制器
    */
    // 因为我们手动的去调用了一句代码:removeFromSuperview,会将当前视图从父控件(控制器的View)里面移除,
    
    
    
    var target: UIViewController?
    
    // 装有菜单按钮的数组
    var buttons: [HMComposeButton] = [HMComposeButton]()

    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI(){
        frame = UIScreen.mainScreen().bounds
        backgroundColor = RandomColor()
        
        // 磨砂的背景图
        let bgImageView = UIImageView(image: getScreenShot().applyLightEffect())
        addSubview(bgImageView)
        
        // 添加广告语
        addSubview(sloganView)
        
        // 添加约束
        sloganView.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self)
            make.top.equalTo(100)
        }
        
        addChildButtons()
    }
    
    func addChildButtons(){
        
        let itemW: CGFloat = 80
        let itemH: CGFloat = 110
        
        // 每一个按钮之前的间距
        let itemMargin = (SCREENW - 3 * itemW)/4
        
        // 读取按钮上要显示的数据
        let path = NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil)!
        // 读取到plist文件
        let array = NSArray(contentsOfFile: path)!
        
        var menuInfos = [HMComposeMenuInfo]()
        // 进行字典转模型
        for dict in array {
            let info = HMComposeMenuInfo(dict: (dict as! [String: AnyObject]))
            menuInfos.append(info)
        }
        
        for (i,info) in menuInfos.enumerate() {
            // 添加6个图标在上面文字在下面的按钮
            let button = HMComposeButton()
            // 添加按钮点击事件
            button.addTarget(self, action: "composeButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)

            // 区分不同的按钮
            button.tag = i
            
            button.frame.size = CGSize(width: itemW, height: itemH)
            // 设置数据
            button.menuInfo = info
//            // 设置图标以及文字
//            button.setImage(UIImage(named: info.icon!), forState: UIControlState.Normal)
//            button.setTitle(info.title!, forState: UIControlState.Normal)
            addSubview(button)
            // 添加到按钮数组里面去,以便在下面执行按钮的动画
            buttons.append(button)
            // 设置按钮的位置
            // 1. 求出该按钮的所在的列数与行数
            let col = i % 3
            let row = i / 3
            
            // 设置x值
            button.frame.origin.x = CGFloat(col + 1) * itemMargin + CGFloat(col) * itemW
            // y值
            button.frame.origin.y = CGFloat(row) * (itemH + itemMargin) + SCREENH
        }
    }
    
    
    func show(target: UIViewController) {
        target.view.addSubview(self)
        
        // 记录target,以便在点击按钮要弹出控制器的时候使用
        self.target = target
    }
    // 6个按钮点击的监听方法
    @objc private func composeButtonClick(button: HMComposeButton){
        print("哈哈")
        
        // 放大的动画
        UIView.animateWithDuration(0.25, animations: { () -> Void in
            for value in self.buttons {
                // 如果遍历到的是当前点击的按钮,放大并透明
                value.alpha = 0.01
                value.transform = value == button ? CGAffineTransformMakeScale(2, 2) : CGAffineTransformMakeScale(0.01, 0.01)
            }
        }, completion: { (_) in
            
            // 取到按钮显示的信息
            let menuInfo = button.menuInfo
            
            
            // print(NSStringFromClass(HMComposeViewController.self))

            // 根据类名去初始化控制器,注意在Swift有命名空间的前缀
            let targetClass = NSClassFromString(menuInfo!.targetVC!) as! UIViewController.Type
            // 注意:init()没有智能提示
            let vc = targetClass.init()
            
//            if button.tag == 0 {
//                // 要弹出文字控制器
//            }else if button.tag == 1 {
//                
//            }
            //
            // 动画执行完毕,弹出控制器
            self.target?.presentViewController(HMNavigationController(rootViewController: vc), animated: true, completion: {
                self.removeFromSuperview()
            })
        })
        
        
//        for value in buttons {
//            // 如果遍历到的是当前点击的按钮,放大并透明
//            
//            if value == button {
//                // 放大的动画
//                UIView.animateWithDuration(5, animations: { () -> Void in
//                    value.transform = CGAffineTransformMakeScale(2, 2)
//                    value.alpha = 0.01
//                })
//            }else{
//                // 缩小的动画
//                UIView.animateWithDuration(5, animations: { () -> Void in
//                    value.transform = CGAffineTransformMakeScale(0.01, 0.01)
//                    value.alpha = 0.01
//                })
//            }
//        }
        
    }
    
    deinit {
        print("我销毁啦")
    }
    
    //        let data = UIImagePNGRepresentation(image)
    //        data?.writeToFile("/Users/xiele/Desktop/哈哈.png", atomically: true)
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // 执行向下的动画
        // 执行6个按钮的动画
        
        buttonsAnimation(false)
//        for (index,value) in buttons.reverse().enumerate() {
//            let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
//            // 指定控件执行动画的最终位置
//            animation.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y + 330))
//            // [0,20],越大幅度越大
//            animation.springBounciness = 10
//            // 速度
//            animation.springSpeed = 8
//            // 开始时间
//            animation.beginTime = CACurrentMediaTime() + Double(index) * 0.025
//            value.pop_addAnimation(animation, forKey: nil)
//        }
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64((0.4 * Double(NSEC_PER_SEC)))), dispatch_get_main_queue(), {
            self.removeFromSuperview()
        });
        
    }
    
    /// 执行按钮的东西
    ///
    /// - parameter isUp: 是否是上来的动画
    func buttonsAnimation(isUp: Bool) {
        
        // 根据是否是上来的动画,去判断是否要返转数组
        let array = isUp ? buttons : buttons.reverse()
        
        for (index,value) in array.enumerate() {
            let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
            // 指定控件执行动画的最终位置
            animation.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y + (isUp ? -330 : 330)))
            // [0,20],越大幅度越大
            animation.springBounciness = 10
            // 速度
            animation.springSpeed = 8
            // 开始时间
            animation.beginTime = CACurrentMediaTime() + Double(index) * 0.025
            value.pop_addAnimation(animation, forKey: nil)
        }
    }
    
    

    override func didMoveToSuperview() {
        super.didMoveToSuperview()
        
        buttonsAnimation(true)
        
//        // 执行6个按钮的动画
//        for (index,value) in buttons.enumerate() {
//            let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
//            // 指定控件执行动画的最终位置
//            animation.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y - 330))
//            // [0,20],越大幅度越大
//            animation.springBounciness = 10
//            // 速度
//            animation.springSpeed = 8
//            // 开始时间
//            animation.beginTime = CACurrentMediaTime() + Double(index) * 0.025
//            value.pop_addAnimation(animation, forKey: nil)
//        }
    }
    
    
    // 截取当前屏幕的内容
    private func getScreenShot() -> UIImage {
        
        let rect = UIScreen.mainScreen().bounds
        let window = UIApplication.sharedApplication().keyWindow!
        
        // 1. 开启图形的上下文
        // 参数1: 开启上下文大小,参数2是否透明,参数3如果是0就代表截取的是实际尺寸的大小,1的话是代码是点坐标大小
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        // 2. 将屏幕的内容画到上下文中
        window.drawViewHierarchyInRect(rect, afterScreenUpdates: false)
        // 3. 取到图片
        let image = UIGraphicsGetImageFromCurrentImageContext()
        // 4. 关闭上下文
        UIGraphicsEndImageContext()
        // 5. 返回图片
        return image
    }
    
    
    // MARK: - 懒加载控件
    private lazy var sloganView: UIImageView = UIImageView(image: UIImage(named: "compose_slogan"))
}
